package br.unicamp.ic.inf300.arena.action.vendas;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import br.unicamp.ic.inf300.arena.modelo.pessoa.Espectador;
import br.unicamp.ic.inf300.arena.modelo.pessoa.TipoEspectador;

/**
 * Classe responsavel por transformar a entrada de dados no PASSO II do JSP vendaOnline em
 * objetos do dominio de negocio (pacote modelo), especificamente espectadores. 
 *
 */
public class IdentificacaoEspectadoresManagerBean {
	private boolean disponibilidade;

	private Set<Espectador> espectadores;

	public IdentificacaoEspectadoresManagerBean() {
		disponibilidade = true;

		espectadores = new HashSet<Espectador>();
	}


	/**
	 * Vincula espectadores a um evento respeitando o limite de vagas disponiveis para este.
	 * 
	 * @param espectador
	 * 
	 */
	public boolean adicionar(Espectador espectador) {
		if ( validarDisponibilidade() ) {
			try {
				espectadores.add(espectador);
				return true;
			}
			catch (Exception e) {
				return false;
			}
		}
		else {
			return false;
		}
	}


	/**
	 * Valida disponibilidade atual de vagas para um determinado evento frente a adicao /
	 * identificacao de espectadores.
	 *
	 * A cada chamada adicionar(..), deve-se checar a quantidade atual de vagas livres para o
	 * evento selecionado para evitar a pratica de "overbooking".
	 *
	 * Detectado indisponibilidade, deve-se desabilitar o botao de adicao de espectadores na interface.
	 *
	 * @return boolean
	 *
	 */
	private boolean validarDisponibilidade() {
		//cabe uma implementacao aq para o cenario de controle de overbooking
		return true;
	}


	/**
	 * Informa total de espectadores.
	 * 
	 * @return int
	 */
	public int total() {
		return espectadores.size();
	}


	//-- getters
	/**
	 * Metodo utilitario para camada de apresentacao. 
	 * Booleano indicando se ha disponibilidade a partir da logica do metodo validarDisponibilidade.
	 * 
	 */
	public boolean getDisponibilidade() {
		return this.disponibilidade;
	}


	/**
	 * Propriedade espectadores foi implementada na verdade como java.util.Set para restringir o uso de
	 * documentos repetidos no processo de identificacao de espectadores.
	 * 
	 * @return Collection<Espectador>
	 */
	public Collection<Espectador> getEspectadores() {
		return espectadores;
	}


	/**
	 * Metodo utilitario para camada de apresentacao. Selecionar tipo de espectador.
	 * 
	 * @return Collection<TipoEspectador>
	 */
	public Collection<TipoEspectador> getTipos() {
		return TipoEspectador.getTipos();
	}


	//-- no setter visible to outside world, programacao defensiva
	protected final void setEspectadores(Set<Espectador> espectadores) {
		this.espectadores = espectadores;
	}
	protected final void setDisponibilidade(boolean disponivel) {
		this.disponibilidade = disponivel;
	}
}